package net.funafuna.funamail;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

public class Util {

    public static String base64Encode(String text) {
        try {
            return "=?ISO-2022-JP?B?" + Base64.encode(text, "x-windows-iso2022jp") + "?=";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    public static String addressBase64Encode(String address) {
        // TODO イレギュラーケースとか「"」、「(」を使ったケース等に対応できるようにしないと。
        final StringBuilder sb = new StringBuilder();
        final String[] value = address.split(",");
        for (String add : value) {
            int start = add.indexOf('<');
            if (start > 0) {
                if (add.charAt(start - 1) == ' ') {
                    // < の前の半角空白はBase64エンコードしない
                    // TODO アドレスの開始が半角の場合はそれもエンコードしたくない
                    start--;
                }
                sb.append(base64Encode(add.substring(0, start))).append(add.substring(start));
            } else {
                sb.append(add);
            }
            sb.append(",");
        }
        return sb.substring(0, sb.length() - 1);
    }

    public static String getPlainAddress(String address) {
        // TODO イレギュラーケースとか「"」、「(」を使ったケース等に対応できるようにしないと。
        // TODO getPlainAddresses と共通なロジックをまとめたい
        final StringBuilder sb = new StringBuilder();
        final String[] value = address.split(",");
        for (String add : value) {
            final int start = add.indexOf('<');
            if (start > 0) {
                sb.append(add.substring(start + 1, add.length() - 1));
            } else {
                sb.append(add);
            }
            sb.append(",");
        }
        return sb.substring(0, sb.length() - 1);
    }

    public static List<String> getPlainAddresses(String address) {
        // TODO イレギュラーケースとか「"」、「(」を使ったケース等に対応できるようにしないと。
        final String[] value = address.split(",");
        final List<String> list = new ArrayList<String>(value.length);
        for (String add : value) {
            final int start = add.indexOf('<');
            if (start > 0) {
                list.add(add.substring(start + 1, add.length() - 1));
            } else {
                list.add(add);
            }
        }
        return list;
    }

    public static String createLoginInfo(String userName, String password) {
        return Base64.encode(userName + "\0" + userName + "\0" + password);
    }
}
